/*
 * @Description:
 * @Author: your name
 * @version:
 * @Date: 2025-05-07 10:38:24
 * @LastEditors: your name
 * @LastEditTime: 2025-06-20 13:59:08
 */
#ifndef _MOD_UPDATE_MCU_H_
#define _MOD_UPDATE_MCU_H_

#include <cstdint>

#include <stdio.h>

// #define ERROR		-1

// 底层升级状态机
typedef enum
{
    UPG_STA_IDLE = 0,    // 升级空闲
    UPG_STA_BEGIN,       // 开始升级
    UPG_STA_UNDER,       // 正在下载
    UPG_STA_SUSS,        // 升级成功
    UPG_STA_ERR,         // 升级失败
    UPG_STA_RST,         // 系统复位
} app_upgrade_state_t;

// 状态机状态
typedef enum
{
    STATE_FIND_HEADER_1,    // 寻找第一个帧头字节
    STATE_FIND_HEADER_2,    // 寻找第二个帧头字节
    STATE_READ_HEADER,      // 读取帧头剩余部分
    STATE_READ_CONTENT      // 读取内容部分
} STATE_READ;

#define ERR_SUCCESS              0X00    // 无错误
#define ERR_CMD_PARAM            0X01    // 参数错误
#define ERR_FLASH                0X02    // flash 操作错误
#define ERR_BUSY                 0X03    // 组件忙
#define ERR_NO_MEM               0X04    // 存储资源不足
#define ERR_COMM_CRC             0X05    // CRC错误
#define ERR_COMM_TimeOut         0X06    // 超时
#define ERR_TEMP_CTR_NO_ENABLE   0X07    // 温控未使能
#define ERR_TEMP_CTR_TEMP_OVER   0X08    // 温度超上限
#define ERR_TEMP_CTR_POT_NO_ROLL 0X09    // 状态是锅在工作中，但检测到锅没旋转。
#define ERR_FIND_ZERO            0X0A    // 找零出错
#define ERR_NO_ZERO              0X0B    // 执行前必须先找零位(组合复位)
#define ERR_LIMIT                0X0C    // 超出运动限制，锅运动超出软件保护范围
#define ERR_INFO_ERROR           0X0D    // 型号错误
#define ERR_TEMP_OVER            0X0E    // 温度超温
#define ERR_OPEN                 0X0F    // 开路错误
#define ERR_SHORT                0X10    // 短路错误
#define ERR_LOCKED               0X11    // 堵转错误

#define ERR_OTA_ONE_TIMEOUT      0X19    // 单帧间隔时间过长
#define ERR_OTA_MAX_TIMEOUT      0X1A    // 总升级时间过长
#define ERR_OTA_CHECKOUT         0X1B    // 升级校验失败
#define ERR_OTA_NOT_START        0X1C    // 未收到的开始升级指令

// #define PRINT(format,...)  printf(format,__VA_ARGS__)
#define PRINT(...)               printf(__VA_ARGS__)

int  update_mcu(const char *src_file, const char *config_file);
int  GetSysState(void);
void ResetMCU(void);

long long getHighPrecisionTimeMillis();

#define BUGLOG(format, ...)                                                                             \
    do {                                                                                                \
        char buf[1024];                                                                                 \
        snprintf(buf, sizeof(buf), "[%lld][Line: %d]: " format, getHighPrecisionTimeMillis(), __LINE__, \
                 ##__VA_ARGS__);                                                                        \
        std::cout << buf << std::endl;                                                                  \
        std::ofstream logfile("../../buglog.txt", std::ios::app);                                       \
        if (logfile.is_open()) {                                                                        \
            logfile << buf << std::endl;                                                                \
            logfile.close();                                                                            \
        }                                                                                               \
    } while (0)

#endif    //
